#ifndef  __UART_H
#define  __UART_H

#include <stdint.h>
#include "main.h"

/* 发送模式枚举 */
typedef enum
{
    USART_TRANSFER_NONE=0,
    USART_TRANSFER_BLOCKING,
    USART_TRANSFER_IT,
    USART_TRANSFER_DMA,
} USART_TRANSFER_MODE;

#define USART_RXBUFF_LIMIT 256 // 如果协议需要更大的buff,请修改这里

typedef struct 
{
    UART_HandleTypeDef *usart_handle;      // 实例对应的usart
    uint8_t recv_buff[USART_RXBUFF_LIMIT]; // 预先定义的最大buff大小,如果太小请修改USART_RXBUFF_LIMIT
    uint8_t recv_buff_size;                // 模块接收一包数据的大小
    /* data */
}usart;



/**
 * @brief 通过调用该函数可以发送一帧数据,需要传入一个usart实例,发送buff以及这一帧的长度
 * @note 在短时间内连续调用此接口,若采用IT/DMA会导致上一次的发送未完成而新的发送取消.
 * @note 若希望连续使用DMA/IT进行发送,请配合USARTIsReady()使用,或自行为你的module实现一个发送队列和任务.
 * @todo 是否考虑为USARTInstance增加发送队列以进行连续发送?
 * 
 * @param _instance 串口实例
 * @param send_buf 待发送数据的buffer
 * @param send_size how many bytes to send
 */
void USARTSend(usart *_instance, uint8_t *send_buf, uint16_t send_size, USART_TRANSFER_MODE mode);

void USARTInit(usart *_instance);


// #define MAX_REC_COUNT  36//可随根据实际使用情况进行调整

// typedef struct
// {
// 	uint8_t ReciveBuff[MAX_REC_COUNT];//接收缓冲区
// 	uint8_t uartRecCount;//接收数据的计数器
// 	uint8_t RecFlag:1;//接收标志位  主要用于数据处理
// }DMAuartReciveBuff;


// typedef struct
// {
// 	DMAuartReciveBuff userUart1;
// 	DMAuartReciveBuff userUart2;
// 	DMAuartReciveBuff userUart3;
// }UART_REC;


// typedef struct
// {
// 	uint8_t DMAbuff[MAX_REC_COUNT];
// }uBbuffer;

// typedef struct
// {
// 	uBbuffer usr_uart1;
// 	uBbuffer usr_uart2;
// 	uBbuffer usr_uart3;
// }UART_MEMCPY_BUFF;//复制DMA的数据  用于解析

// extern UART_MEMCPY_BUFF usr_dma_Data;
// extern UART_REC userUart;

// void USR_UART_Init();//串口初始化函数
// void UART1_IRQ_DataGet();//在串口中断服务函数中添加此函数用于缓存数据
// void UART2_IRQ_DataGet();
// void UART3_IRQ_DataGet();


#endif // ! __UART_H
